package $3exceptionhandler;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class FnJavasThrowable {

    public static void main(String[] args) throws UnsupportedEncodingException {
        // Java的异常
        // Throwable是异常体系的根，它继承自Object。
        // Throwable有两个体系：Error和Exception

        // Error 表示严重的错误，程序对此一般无能为力。
        // OutOfMemoryError：内存耗尽
        // NoClassDefFoundError：无法加载某个Class
        // StackOverflowError：栈溢出

        // Exception 是运行时的错误，它可以被捕获并处理。
        // 某些异常是应用程序逻辑处理的一部分，应该捕获并处理。例如：
        // NumberFormatException：数值类型的格式错误
        // FileNotFoundException：未找到文件
        // SocketException：读取网络失败

        // 还有一些异常是程序逻辑编写不对造成的，应该修复程序本身。例如：
        // NullPointerException：对某个null的对象调用方法或字段
        // IndexOutOfBoundsException：数组索引越界

        // Exception又分为两大类：
        // 1、RuntimeException以及它的子类；
        // 2、非RuntimeException（包括IOException、ReflectiveOperationException等等）

        // Java规定：
        // 必须捕获的异常，包括Exception及其子类，但不包括RuntimeException及其子类，这种类型的异常称为Checked Exception。
        // 不需要捕获的异常，包括Error及其子类，RuntimeException及其子类。

        // 捕获异常
        // 捕获异常使用try...catch语句，把可能发生异常的代码放到try {...}中，然后使用catch捕获对应的Exception及其子类

        byte[] bs = toGBK("中文");
        System.out.println(Arrays.toString(bs));

        byte[] bs1 = toGBK1("中文");
        System.out.println(Arrays.toString(bs1));


    }
    // 在toGBK()方法中，因为调用了String.getBytes(String)方法，就必须捕获UnsupportedEncodingException。
    private static byte[] toGBK(String s) {
        try {
            // 用指定编码转换String为byte[]:
            return s.getBytes("GBK");
        } catch (UnsupportedEncodingException e) {
            // 如果系统不支持GBK编码，会捕获到UnsupportedEncodingException:
            System.out.println(e); // 打印异常信息
            // 先记下来再说:
            e.printStackTrace();
            return s.getBytes(); // 尝试使用用默认编码
        }
    }
    // 我们也可以不捕获它，而是在方法定义处用throws表示toGBK()方法可能会抛出UnsupportedEncodingException，就可以让toGBK()方法通过编译器检查
    static byte[] toGBK1(String s) throws UnsupportedEncodingException {
        return s.getBytes("GBK");
    }

    /*
     * 小结
     * Java使用异常来表示错误，并通过try ... catch捕获异常；
     * Java的异常是class，并且从Throwable继承；
     * Error是无需捕获的严重错误，Exception是应该捕获的可处理的错误；
     * RuntimeException无需强制捕获，非RuntimeException（Checked Exception）需强制捕获，或者用throws声明；
     * 不推荐捕获了异常但不进行任何处理。
     * */

}
